(()=>{
    // 基础类型 Number,String,Boolean,Object,Null,Undefined Symbol
    // let str:string = ""
    // str = "1234"
    // 错误写法
    // str = 1234

    // 数组添加类型
    // let arr:Array<number|string> = [1,2,3,4,5,"12"]

    // let newarr:number[] = [1,2,3,4,5]

    //定义对象

    // let obj :{ 
    //     name:string,
    //     age:number
    // } = {
    //     name:"马金柯",
    //     age:18
    // }
    // let obj = {
    //     name:"马金柯",
    //     age:18
    // }

    // 接口 interface
    // interface MaObj {
    //     name:string,
    //     age:number,
    //     like?:string
    // }
    
    // let obj:MaObj ={
    //     name:"马金柯",
    //     age:18,
    //     // like:"eat food"
    // }

    // 数组嵌套对象
    // interface arrItem {
    //     name:string|number,
    //     age:number
    // }

    // let arr:Array<arrItem> = [  
    //     {
    //         name:"1",
    //         age:1
    //     },
    //     {
    //         name:1,
    //         age:1
    //     }
    // ]

    /*
        函数
        void 函数没有返回值
    */

    // 求和
    // const fn = (arr:Array<number>) :number=> {
    //     let sum :number = 0
    //     arr.forEach((item:number)=>{
    //         sum += item
    //     })
    //     return sum
    // }

    // 二维转一维
    // const fn = (arr:Array<number|Array<number>>):Array<number> =>{
    //     let newarr:number[] = []
    //     arr.forEach((item:Array<number>|number)=>{
    //         if (Array.isArray(item)) { //判断一个数组是否为数组 如果是返回true 不是返回flase
    //             newarr.push(...fn(item))
    //         }else{
    //             newarr.push(item)
    //         }
    //     })
    //     return newarr
    // }
    // [1,2,3,4,5]

    // 补0  1 01 10 10

    // const fn = (arr:Array<number>):Array<number|string> =>{
    //     let newarr: Array<number|string> = []
    //     arr.forEach((item:number)=>{
    //         if (item<10) {
    //             newarr.push("0"+item)
    //         }else{
    //             newarr.push(item)
    //         }
    //     })
    //     return newarr
    // }   

    // 模拟数组 push

    // const fn = (arr:number[],...rest:number[]):number=>{
    //     rest.forEach((item:number)=>{
    //         arr.push(item)
    //     })
    //     return arr.length
    // }
    // // [1,2,3,4,5]
    // console.log(fn([1,2],3,4,5));
    
    /*
        枚举
        如果不规定枚举中的每一项 那么拿到的是他的下标  如果规定了 拿到的是这一项的值

        1. 数字枚举
        2. 字符串枚举
    */ 

    // enum Direction {
    //     Up = 1,
    //     Down,
    //     Left,
    //     Right
    // }
    // enum strDirection {
    //     Up = "刘江珊",
    //     Down = "王昆鹏",
    //     Left = "朱兴圆",
    //     Right = "闫东雨跳黑桃A"
    // }

    // const fn = (direction:strDirection) =>{
    //     console.log(direction);
        
    // }

    // fn(strDirection.Left)
    
    /*
        es5 中的函数和es6中的函数 区别
        1. 写法上的区别
        2. es5函数指向 谁调用就指向谁 es6默认指向父级元素 修改this指向 bind call apply
        3. es5 获取所有参数 使用 arguments es6 ...rest
        4. es5 设置默认参数需要在函数中设置 es6 可以直接在形参中设置

    */
    
    /*
        class 类

        1. extends 继承
        2. public 公有属性
        3. private 私有属性
        4. static 静态属性
        5. readonly 只读属性
        6. protected 受保护的
    */ 
//    class LiYun {
//         // 定义只读方法
//         readonly flag = false
//         name :string
//         // 定义私有属性
//         private age = 18
//         // 定义静态属性
//         static like = "篮球"
       
//         constructor(name:string = "刘江珊"){
//             this.name = name
//         }
//         // 定义公有方法
//         public get_name = () => {
//             return  `名字是${this.name},年龄是${this.age},我喜欢是${LiYun.like}` 
//         }    
//         public set_name = (str:string) =>{
//             this.name = str
//             this.fn()
//             return this.name
//         }
//         protected fn = ()=>{
//             console.log("fn",this);
            
//         }
//    }

//    class Students extends LiYun {
//         constructor(props:any){
//             super(props)
//             console.log(this);
            
//         }
//    }
//    let my_Class = new LiYun("高哲")

//    let my_students = new Students("123")
   
//    console.log("11",my_students.flag);
   
//    console.log(my_Class.set_name("姜国庆"));

  
   /*
        函数
        可选参数 ？
        默认参数 在形参中设置  str = "111"
        剩余参数 ...xxx
        函数重载

        函数重载重载的是函数中的每一个功能，但细节不太一样
        比如有一个函数 有多个参数 每一个参数代表不同的意义 这个时候就会用到函数重载
   */ 
    function State (name:string):string
    function State (age:number):number
    function State (nameorage:any){
        if (typeof nameorage === "string") {
            alert("姓名")
        }else
        {
            alert("年龄")
        }
    }
    State("1")


    //    const fn = (name:string,age:number,str?:string) =>{
    //     console.log(name,age,str);
        
    //    }
    //    console.log(fn("姜国庆",18));

    /*
        晚上作业
        1. 找最长单词 ["aaaaaaaa","bbbb","ccc"]
        2. 菲波纳锲 第三项的值 等于前两项值的和
        3. 冒泡排序
        4. 补0
        预习 接口 装饰器

    */
   
   
})()
